/**
 * Created by NMTua on 2015/12/2.
 */

com.Select = function(select, debug){
    this.select = $(select) || null; //select元素
    this.debug = debug || false;    //调试模式
    this.level = [];    //层级比例，数量控制层级，数值控制比例
    this.type = null;  //类型 city | position | date
    this.multiple = 1;  //可选数量
    this.data = null; //数据， {key: val}
    this.dataUrl = null;    //数据来源 json
    this.val = null;    //默认值
    this.pre = 'my';    //class前缀
    this.dataPre = 'a'; //数据key前缀
    this.placeholder = '请选择';
    this.selectedVal = [];

    this.dateRange = [-70, -16];    //type == date 时的范围， 【开始年数， 结束年数】 以今天零点计算，负数为过去，正数为将来
    this.dateMin = null;    //计算出来的最小年份
    this.dateMax = null;    //计算出来的最大年份

    this.obj = null;    //模拟下拉菜单容器
    this.valObj = null; //模拟文本框容器
    this.selected = [];   //已选中元素
    this.selectedBar = null; //显示已选中元素区域
    this.layerId = null;    //弹窗id

};

com.Select.prototype.init = function(){
    var s = this;

    if(s.select == null || s.select.length == 0){
        s.log('非法参数 或 找不到该元素！');
        return;
    }

    //非调试模式下，表单元素隐藏
    if(!s.debug){
        s.select.hide();
    }

    //插入模拟的表单元素
    s.select.after('<div class="'+ s.pre +'_selectVal mySelectVal">'+ (s.val || s.select.attr('placeholder') || s.placeholder) +'</div>');
    s.valObj = s.select.next('.mySelectVal');

    //初始化层级、比例
    if(s.level.length == 0){
        if(s.type == 'city'){
            s.level = [1, 2];
        } else if(s.type == 'position'){
            s.level = [3, 4];
        } else if(s.type == 'date'){
            s.level = [4, 4, 3];
        } else {
            s.level = [1];
        }
    }

    //调试模式下，表单元素绑定点击事件
    if(s.debug){
        s.select.on('click', function(){
            s.open();
        });
    }
    //模拟元素绑定点击事件
    s.valObj.on('click', function(){
        s.selected = [];
        s.open();
    });

};
//打开
com.Select.prototype.open = function(){
    var s = this;

    //弹出选择层
    s.layerId = layer.open({
        type: 1,
        content: '',
        anim: 0,
        style: '',
        className: s.pre +'_select mySelect',
        success: function(){
            s.checkData(function(data){
                s.log(data);
                s.obj = $('.mySelect');

                s.layout(); //初始化弹出层结构

                //输出一级菜单
                var le1 = '';
                $.each(data, function(i, item){
                    if(s.type == 'date' && typeof i == 'number' && typeof item == 'number'){
                        le1 += '<div class="row" data-id="'+ item +'">'+ item +'年</div>';
                    }
                    if(typeof i == 'string'){
                        le1 += '<div class="row" data-id="'+ i +'">'+ item.name +'</div>';
                    }
                });
                s.obj.find('.mySelectLevel1').append(le1);

                //绑定一级菜单点击事件
                $('.mySelectLevel1').on('click', '.row', function(){
                    s.selectedVal[0] = $(this).data('id');
                    //没有下级菜单
                    if(s.level.length == 1){
                        //高亮
                        $(this).addClass('current').siblings().removeClass('current');
                        s.backVal($(this).data('id'), $.trim($(this).text()));
                        return;
                    }

                    //有下级菜单
                    //已高亮，退出
                    if($(this).hasClass('current')){
                        return;
                    }
                    //高亮
                    $(this).addClass('current').siblings().removeClass('current');
                    //输出二级菜单
                    var le2 = '';
                    //地区数据有一维，所以这里要判断一下，把一维输出出来
                    s.log();
                    if(data[$(this).data('id')].child == undefined){
                        le2 += '<div class="row" data-id="'+ $(this).data('id') +'">'+ data[$(this).data('id')].name +'</div>';
                    } else {
                        $.each(data[$(this).data('id')].child, function(i, item){
                            le2 += '<div class="row" data-id="'+ i +'">'+ item +'</div>';
                        });
                    }
                    //date模式
                    if(s.type == 'date'){
                        var year = s.selectedVal[0];
                        var month = ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'];
                        var i = 0;
                        if(year == s.dateMax){
                            i = new Date().getMonth();
                        }
                        if(year == s.dateMin){
                            month.length = new Date().getMonth() + 1;
                        }
                        for(i; i < month.length; i++){
                            le2 += '<div class="row" data-id="'+ (i+1) +'">'+ month[i] +'</div>';
                        }
                    }
                    s.obj.find('.mySelectLevel2').html(le2);
                });

                //绑定二级菜单点击事件
                $('.mySelectLevel2').on('click', '.row', function(){
                    s.selectedVal[1] = $(this).data('id');
                    //没有下级菜单
                    if(s.level.length == 2){
                        //高亮
                        $(this).addClass('current').siblings().removeClass('current');
                        s.backVal($(this).data('id'), $.trim($(this).html()));
                        return;
                    }

                    //有下级菜单
                    //已高亮，退出
                    if ($(this).hasClass('current')) {
                        return;
                    }
                    //高亮
                    $(this).addClass('current').siblings().removeClass('current');

                    var le3 = '';
                    //date模式
                    if(s.type == 'date'){
                        var year = s.selectedVal[0];
                        var month = s.selectedVal[1];
                        var day = 30;
                        //大月
                        if([1, 3, 5, 7, 8, 10, 12].indexOf(month) >= 0){
                            day = 31;
                        }
                        //闰月
                        if(month == 2){
                            if((year % 4 == 0 && year % 100 != 0) || (year % 100 == 0 && year % 400 != 0)){
                                day = 29;
                            } else {
                                day = 28;
                            }
                        }
                        var i = 0;
                        if(year == s.dateMax && month == new Date().getMonth() + 1){
                            i = new Date().getDate() - 1;
                        }

                        if(year == s.dateMin && month == new Date().getMonth() + 1){
                            day = new Date().getDate();
                        }

                        for(i; i < day; i++){
                            le3 += '<div class="row" data-id="'+ (i+1) +'">'+ (i+1) +'日</div>';
                        }
                    }
                    s.obj.find('.mySelectLevel3').html(le3);
                });

                //绑定三级菜单点击事件
                $('.mySelectLevel3').on('click', '.row', function(){
                    s.selectedVal[2] = $(this).data('id');
                    //没有下级菜单
                    if(s.level.length == 3){
                        //高亮
                        $(this).addClass('current').siblings().removeClass('current');
                        s.backVal($(this).data('id'), $.trim($(this).html()));
                        return;
                    }
                });
            });
        }
    });

};

//关闭
com.Select.prototype.close = function(){
    var s = this;
    layer.close(this.layerId);
    if(s.callback){
        s.callback(s.selected);
    }
};

//回传选定值
com.Select.prototype.backVal = function(key, val){
    var s = this;

    if(s.type == 'date'){
        s.select.val(s.selectedVal[0] + '-' + s.selectedVal[1] + '-' + s.selectedVal[2]);
        s.valObj.text(s.selectedVal[0] + '年' + s.selectedVal[1] + '月' + s.selectedVal[2] + '日');
        s.close();
    } else {
        //处理key前缀
        if(typeof key == 'string'){
            key = key.replace(s.dataPre, '');
        }
        if(s.selected.length != s.multiple) {
            //判断是否已选
            var _selected = false;
            $.each(s.selected, function(i, item){
                if(item.key == key){
                    _selected = true;
                }
            });
            //未选中，则执行
            if(!_selected){
                s.obj.find('.save').text('保存');
                s.selectedBar.show();
                s.selectedBar.append('<span data-id="'+ key +'">'+ val +'</span>');
                s.selected.push({key: key, val: val});
            }
        }
        if(s.selected.length == s.multiple){
            var _key = [], _val = [];
            $.each(s.selected, function(i, item){
                _key.push(item.key);
                _val.push(item.val);
            });
            s.select.val(_key.join(','));
            s.valObj.text(_val.join(', '));
            s.close();
        }
    }
};

//取select数据
com.Select.prototype.checkData = function(callback){
    var s = this;
    //date模式
    if(s.type == 'date'){
        var year = new Date().getFullYear();
        s.dateMin = year + s.dateRange[0];
        s.dateMax = year + s.dateRange[1];
        s.data = [];
        for(var i = s.dateMax; i >= s.dateMin; i--){
            s.data.push(i);
        }
    }
    //给定数据
    if(s.data != null){
        callback(s.data);
        return;
    }
    //未给定数据
    if(typeof window['selectData'+ s.type] == 'undefined'){    //没有数据的时候，异步取数据
        $.getJSON(s.dataUrl, function(data){
            window['selectData'+ s.type] = data;
            callback(data);
        })
    } else {
        callback(window['selectData'+ s.type]);
    }
};

//初始化弹出层结构
com.Select.prototype.layout = function(){
    var s = this;
    //layout
    var layout = '' +
        '<div class="'+ s.pre +'_selectHeader mySelectHeader l-f l-f-middle">' +
            '<div class="mySelectHeaderLeft"><a href="#"><i class="iconfont">&#xf602;</i></a></div>' +
            '<div class="mySelectHeaderTitle l-f-g1">'+ s.placeholder +'</div>' +
            '<div class="mySelectHeaderRight"><span class="save">取消</span></div>' +
        '</div>' +
        '<div class="mySelectedBar"></div>' +
        '<div class="mySelectBody l-f"></div>' +
        '';
    s.obj.append(layout);
    //selectBar
    s.selectedBar = s.obj.find('.mySelectedBar');
    //绑定点击事件，点击删除选中元素
    s.selectedBar.on('click', 'span', function(){
        var key = $(this).data('id');
        $(this).remove();
        $.each(s.selected, function(i, item){
            if(item.key == key){
                s.selected.splice(i, 1);
                return false;
            }
        });
        if(s.selected.length == 0){
            s.obj.find('.save').text('取消');
            s.selectedBar.hide();
        }
    });
    //css
    $('.mySelectBody').height($(window).height() - $('.mySelectHeader').height());
    //插入层级容器
    for(var i = 0; i < s.level.length; i++){
        s.obj.find('.mySelectBody').append('<div class="mySelectLevel mySelectLevel'+ (i+1) +' l-f-g'+ s.level[i] +'"></div>');
    }
    //绑定后退事件
    s.obj.find('.mySelectHeaderLeft').on('click', '.iconfont', function(){
        s.close();
    });
    //绑定保存事件
    s.obj.find('.save').on('click', function(){
       if(s.selected.length > 0){
           var _key = [], _val = [];
           $.each(s.selected, function(i, item){
               _key.push(item.key);
               _val.push(item.val);
           });
           s.select.val(_key.join(','));
           s.valObj.text(_val.join(', '));
       }
       s.close();
    });
};

//构建数据x
//com.Select.prototype.dom = function(){
//    var s = this;
//    var html = [];
//    var data = window['selectData'+ s.type];
//    var level = 1;
//    f(data, level);
//    return html.join('');
//
//    //递归
//    function f(obj, level){
//        html.push('<div class="mySelectLevel'+ level +'">');
//        $.each(obj, function (i, item) {
//            if (typeof item == 'object') {
//                f(item, level+1);
//            } else {
//                html.push('<div data-id="'+ i +'">'+i + item +'</div>');
//            }
//        });
//        html.push('</div>');
//    }
//
//};

//-----------------------------------------------------------

com.Select.prototype.log = function(){
    var s = this;
    if(this.debug){
        console.log(arguments.length == 1 ? arguments[0] : arguments);
    }
};